package cn.itsource.basic.aop;

import cn.hutool.extra.spring.SpringUtil;
import cn.itsource.util.RedisService;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect     //我是一个AOP切面类
@Component  //将类交给spring容器管理
@Slf4j
public class DeleteCacheAOP {

    //公式 = 切入点表达式 + 通知方法
    @Pointcut("@annotation(myDeleteCache)") //方法参数级别
    public void pointCut(MyDeleteCache myDeleteCache){
    }


    /**
     * 环绕通知说明
     * 注意事项:
     *  1.环绕通知中必须添加参数ProceedingJoinPoint
     *  2.ProceedingJoinPoint只能环绕通知使用
     *  3.ProceedingJoinPoint如果当做参数 则必须位于参数的第一位
     */
    @Around("pointCut(myDeleteCache)")
    public Object around(ProceedingJoinPoint joinPoint,MyDeleteCache myDeleteCache) {
        Object result = null;
        //通过注解获取当前key
        String key = myDeleteCache.key();
        //通过注解获取当前设置时间
        //获取到 redis的 实现类
        RedisService redisService = SpringUtil.getBean(RedisService.class);

            //表示reids数据不存在,需要查询数据库
            try {
                result = joinPoint.proceed();  //执行目标方法及通知
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
            log.info("删除redis数据,删除的key为:{}",key);
            redisService.deleteRedisByKey(key);

        return result;
    }

}
